# -*- coding: utf-8 -*-
import math;
# 假设你正在爬楼梯。需要 n 阶你才能到达楼顶
# 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
# 注意：给定 n 是一个正整数

# 示例 1：
# 输入： 2
# 输出： 2
# 解释： 有两种方法可以爬到楼顶
# 1.  1 阶 + 1 阶
# 2.  2 阶

# 示例 2：
# 输入： 3
# 输出： 3
# 解释： 有三种方法可以爬到楼顶。
# 1.  1 阶 + 1 阶 + 1 阶
# 2.  1 阶 + 2 阶
# 3.  2 阶 + 1 阶

# 排列组合的方法
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        max_step_2 = n // 2;
        rtn = 0;
        for i in range(0, max_step_2 + 1):
            step_1 = n - i * 2;
            rtn +=  math.factorial(step_1 + i) / math.factorial(i) / math.factorial(step_1);
        return rtn;

# 动态规划的方法
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1;
        if n == 2:
            return 2;
        dp = [0] * n;
        dp[0] = 1;
        dp[1] = 2;
        for i in range(2, n):
            dp[i] = dp[i - 1] + dp[i - 2];
        return dp[n - 1];

t = Solution();
print t.climbStairs(100);